# -*- coding: utf-8 -*-

'''
Moduł zawierający obsługę parsowania plików z macierzami podobieństwa.

'''

import os.path as path
import numpy
from SequenceAlignment import SequenceAlignment

##Zwracany kod, gdy odczytana macierz jest poprawna
MATRIX_OK = 0
##Zwracany kod, gdy odczytana podany plik z macierzą jest niepoprawny
INVALID_MATRIX_FILE = -1
##Zwracany kod, gdy odczytana macierz jest niepoprawna (nie zawiera liczb)
INVALID_MATRIX = -2
##Zwracany kod, gdy odczytana macierz ma niewłaściwe wymiary
INVALID_MATRIX_DIM = -3
##Zwracany kod, gdy odczytana macierz nie jest symetryczna
MATRIX_NOT_SYMMETRICAL = -4

##Funkcja odczytująca macierz podobieństwa z pliku
#@param filePath - ścieżka do pliku z macierzą
#@return - kod oraz macierz, gdy plik i macierz są poprawne
def read_matrix(filePath):
    if path.isfile(filePath):
        try:
            mat = numpy.loadtxt(filePath, delimiter=' ')
            if mat.shape != (SequenceAlignment.DIM-1, SequenceAlignment.DIM-1):
                return (INVALID_MATRIX_DIM, None)
            
            for y in range(SequenceAlignment.DIM-1):
                for x in range(SequenceAlignment.DIM-1)[y:]:
                    if mat[y][x] != mat[x][y]:
                        return (MATRIX_NOT_SYMMETRICAL, None)
            return (MATRIX_OK, mat)
        except ValueError:
            return (INVALID_MATRIX, None)
    else:
        return (INVALID_MATRIX_FILE, None)
